iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0

嗨! 昨天終於結束了語料庫模型建置的部分,再來就要建立 API 了。這個系統中我採用了一個比較特別的架構,伺服器是 Ubumtu + Apache + PHP,API 主要使用 PHP 撰寫,並由 PHP 去執行 Python 腳本(也就是前面建置的 TF-IDF 語料庫模型),再回傳結果。可以參考下圖。

系統架構

其實 Python 也是可以寫後端的,但我缺少建置 Python 伺服器的經驗,期間我嘗試搭配 Python + Apache、用 Python 的框架建置服務,一直沒有成功。哀,這又是另一個走錯路的故事了。

後來聽了朋友建議,採用一個比較像繞過問題的方式,使用 PHP + Apache 作為 API 端服務,PHP 去執行 Python 腳本。換句話說,就是把 PHP 當作是 Android 與 TF-IDF 語料庫之間的橋樑。不過,我覺得這不是一個最好的寫法。

做都做了,還是要記錄一下啊,今天這篇就來介紹使用 PHP 執行 Python 腳本的方法吧。

程式碼

以編號 001 這支來說明
完整程式碼: https://gitlab.com/graduate_lab415/chatbot-api/-/blob/master/getAnswer.php

<?php
/**
 * 001 [POST] /Chatbot/getAnswer.php
 * 以使用者輸入的語句查詢,回傳資料集中與輸入最相似的 3 筆問答組合。
 * 
 * q: 使用者輸入的問句
 * category_id: 使用者選擇的類別編號
 */
header('Content-Type: application/json; charset=utf-8');
$q = $_POST['q'];
$category_id = $_POST['category_id'];
$output = exec('/home/yr/PycharmProjects/nlp/venv/bin/python3 /home/yr/PycharmProjects/nlp/main.py ' . $q . ' ' . $category_id . ' 2>/home/yr/PycharmProjects/nlp/output/log.txt', $output2);
print($output);

首先,會收兩個 Post 參數 $_POST['q']$_POST['category_id'] 執行 Python 腳本時,再把參數帶進去。

$output 會得到 Python 印出的 JSON 內容,再印出來給 Android 端。

簡略一點,就是這個樣子。因為我用的是 Pycharm 的 venv 所以路徑要複雜一點。

python3 main.py "我想申請長照" 2 2>log.txt

2>log.txt: 把標準錯誤寫到檔案中

API

本系統總共有 3 支 API: getAnswer、addAdjustment、getCategories。
各自的詳細說明與程式碼在這: https://gitlab.com/graduate_lab415/chatbot-api


本文同步發布在: https://dreambo4.github.io/2021/10/06/API-%E4%BD%BF%E7%94%A8-PHP-%E5%9F%B7%E8%A1%8C-Python-%E8%85%B3%E6%9C%AC/


上一篇
Day 21 - [語料庫模型] 09-回饋機制
下一篇
Day 23 - [Android APP] 01-架構介紹-MVVM
系列文
長照小幫手 - 從 0 開始建置 Chatbot 的筆記 & 走錯路的心得31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言